#include "constant_medium.h"

bool constant_medium::hit(const ray& r, interval ray_t, hit_record& rec) const
{
	hit_record rec1, rec2;

	if (!boundary->hit(r, interval::universe, rec1))// 确定进入包围盒的位置
		return false;

	if (!boundary->hit(r, interval(rec1.t + 0.0001, infinity), rec2))// 确定离开包围盒的位置
		return false;

	if (rec1.t < ray_t.min) rec1.t = ray_t.min;
	if (rec2.t > ray_t.max) rec2.t = ray_t.max;

	if (rec1.t >= rec2.t)// 判断包围盒是否与射线相交
		return false;

	if (rec1.t < 0)
		rec1.t = 0;

	auto ray_length = r.direction().length();// 射线长度
	auto distance_inside_boundary = (rec2.t - rec1.t) * ray_length;// 射线与包围盒相交的长度
	auto hit_distance = neg_inv_density * std::log(random_double());// 指数函数逆变换采样生成的随机反射长度

	if (hit_distance > distance_inside_boundary)// 反射长度 > 相交长度 ----> 射线未在物体内部发生反射
		return false;

	rec.t = rec1.t + hit_distance / ray_length;// 相交的位置
	rec.p = r.at(rec.t);// 交点位置

	rec.normal = vec3(1, 0, 0);  // 随机
	rec.front_face = true;     // 随机
	rec.mat = phase_function;

	return true;
}
